package config

import (
	"encoding/json"
	"kubem/pkg/logger"

	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

type ServerConf struct {
	Port string `json:"port" toml:"port"`
}

type JwtConf struct {
	Secret string `json:"secret" toml:"secret"`
	Expire int    `json:"expire" toml:"expire"`
}

func (s *ServerConf) PortStr() string {
	return ":" + s.Port
}

type AuthConf struct {
	Username string `json:"username" toml:"username"`
	Password string `json:"password" toml:"password"`
}

type LoggingConf struct {
	Level   string `json:"level" toml:"level"`
	LogFile string `json:"logfile" toml:"logfile"`
}

type MetadataConf struct {
	Namespace string `json:"namespace" toml:"namespace"`
}

type Config struct {
	Server   ServerConf   `json:"server" toml:"server"`
	Jwt      JwtConf      `json:"jwt" toml:"jwt"`
	Auth     AuthConf     `json:"auth" toml:"auth"`
	Logging  LoggingConf  `json:"logging" toml:"logging"`
	Metadata MetadataConf `json:"metadata" toml:"metadata"`
}

func (c *Config) String() string {
	jsonStr, _ := json.Marshal(c)
	return string(jsonStr)
}

var Conf *Config

func LoadConfigFromToml() (*Config, error) {
	if Conf == nil {
		viper.SetConfigName("config") // 配置文件名，不包含扩展名
		viper.SetConfigType("toml")   // 配置文件类型
		viper.AddConfigPath(".")      // 当前目录查找配置文件

		err := viper.ReadInConfig()
		if err != nil {
			logger.Error("Error reading config file:", err)
			return nil, err
		}

		Conf = &Config{}
		err = viper.Unmarshal(Conf)
		if err != nil {
			logger.Error("Error unmarshalling config:", err)
			return nil, err
		}

		// 根据配置文件中的日志级别设置logrus的日志级别
		level, err := logrus.ParseLevel(Conf.Logging.Level)
		if err != nil {
			logger.Warning("Invalid log level in config, using default InfoLevel")
			level = logrus.InfoLevel
		}
		Conf.Logging.Level = level.String()
	}
	return Conf, nil
}

func init() {
	// 1. 自动加载配置文件
	_, err := LoadConfigFromToml()
	if err != nil {
		logger.Error("Error loading config:", err)
	}
	logger.Info("Loaded config:", Conf)
	// 2. 初始化日志
	level, _ := logrus.ParseLevel(Conf.Logging.Level)
	logger.Info("log level: ", level)
	logger.InitLogger(Conf.Logging.LogFile, level)
}
